package com.cosmocoder.persistence;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

public abstract class AbstractDaoFactory {
	Map<Class<?>,Dao<?, ? extends Serializable>> entityDaoMap;
	
	protected void setEntityDaoMap(Map<Class<?>, Dao<?, ? extends Serializable>> entityDaoMap) {
		this.entityDaoMap = entityDaoMap;
	}

	protected Map<Class<?>, Dao<?, ? extends Serializable>> getEntityDaoMap() {
		if(entityDaoMap == null) entityDaoMap = new HashMap<Class<?>, Dao<?,? extends Serializable>>();
		return entityDaoMap;
	}

	@SuppressWarnings("unchecked")
	public <EntityType, IdType extends Serializable> Dao<EntityType, IdType> getDao(Class<EntityType> entityClass) {
		Map<Class<?>,Dao<?, ? extends Serializable>> entityDaoMap = getEntityDaoMap();
		if(entityDaoMap.get(entityClass) == null)
			entityDaoMap.put(entityClass, createDao(entityClass));
		return (Dao<EntityType, IdType>) entityDaoMap.get(entityClass);
	}


	public <EntityType, IdType extends Serializable> void setDaoForEntity(
			Class<EntityType> entityClass, Dao<EntityType, IdType> dao) {
		getEntityDaoMap().put(entityClass, dao);
	}
	
	protected abstract <EntityType, IdType extends Serializable> Dao<EntityType, IdType> createDao(Class<EntityType> entityClass);
}
